package org.example.ui;


import com.alibaba.fastjson2.JSON;
import org.example.utils.WenXinUtils.WenXin;
import org.example.utils.BaiduTranslateUtils.TransApi;
import org.example.utils.BaiduTranslateUtils.TranslateMap;
import org.example.utils.BaiduTranslateUtils.TranslateResult;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.UnsupportedEncodingException;

//界面类，继承JFrame类，实现actionListener接口，从而添加监听器时，事件触发方法写在本类中即可
public class MyJFrame extends JFrame implements ActionListener {

    //标题，设置为静态常量，好进行修改
    private static final String TITLE = "中英翻译";
    //初始中文文本框中的提示信息
    private static final String INITIAL_CN_TEXT = "请输入要翻译的内容";
    //初始英文文本框中的提示信息
    private static final String INITIAL_EN_TEXT = "Please enter the content to be translated";
    //事先准备好的中英文翻译
    private static final String CN_TEXT_TEST = "深圳大学计算机与软件学院是培养高尖端计算机软件人才的摇篮。";
    private static final String EN_TEXT_TEST = "Over the years' development, CSSE has now become a prominent college in education and research nationally and globally.";

    //给大模型的指令
    private static final String CN_TO_EN_COMMAND = "把下面这句话翻译成英文：";
    private static final String EN_TO_CN_COMMAND = "把这句话直接翻译成中文：";

    //字段，类中多个方法使用
    //中文文本框对象
    private JTextArea cnText;
    //中文转英文按钮
    private JButton cnToEn;
    //英文文本框对象
    private JTextArea enText;
    //英文转中文按钮
    private JButton enToCn;
    //百度翻译API对象
    private TransApi BaiduTranslate;

    public MyJFrame()
    {
        //初始化百度翻译API
        BaiduTranslate = new TransApi();
        //初始化界面框架，设置大小以及界面的一些模式
        initJFrame();
        //初始化界面视图，设置文本框和按钮
        initView();
        //设置页面可见
        this.setVisible(true);
    }

    private void initView() {
        //下面是界面的设置

        //设置中英文文本框，翻译按钮
        cnText = new JTextArea();
        //设置初始文本
        cnText.setText(INITIAL_CN_TEXT);
        //设置中文文本框的位置和大小
        cnText.setBounds(40,40,480,220);
        //设置文本框中的文本自动换行
        cnText.setLineWrap(true);
        //获取ContentPane容器对象，将文本框加入其中
        this.getContentPane().add(cnText);

        //中文转英文按钮，设置文本
        cnToEn = new JButton("中译英");
        //设置位置和大小
        cnToEn.setBounds(40,270,140,40);
        //加入容器中
        this.getContentPane().add(cnToEn);
        //当前类实现了事件监听接口，添加该类作为监听器即可
        cnToEn.addActionListener(this);

        //英文文本框
        enText = new JTextArea();
        //初始提示文本设置
        enText.setText(INITIAL_EN_TEXT);
        //文本框位置和大小
        enText.setBounds(40,350,480,220);
        //设置文本自动换行
        enText.setLineWrap(true);
        //加入容器
        this.getContentPane().add(enText);

        //按钮，与上面中转英同理
        enToCn = new JButton("英译中");
        enToCn.setBounds(40,580,140,40);
        this.getContentPane().add(enToCn);
        //当前类实现了事件监听，添加该类作为监听器即可
        enToCn.addActionListener(this);
    }

    private void initJFrame() {
        //设置页面标题
        this.setTitle(TITLE);
        //设置页面大小
        this.setSize(560,700);
        //设置页面居中展示
        this.setLocationRelativeTo(null);
        //取消内部默认布局
        this.setLayout(null);
        //设置页面置顶
        this.setAlwaysOnTop(true);
        //设置关闭模式，关闭页面即销毁对象
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    //事件触发方法
    @Override
    public void actionPerformed(ActionEvent e) {
        //判断触发源是中转英按钮还是英转中按钮
        if(e.getSource() == cnToEn)
        {
            //指令是中文翻译英文
            //处理测试文本的情况
            if(cnText.getText().equals(CN_TEXT_TEST))
            {
                //将对应的英文测试文本设置到英文的文本框即可
                enText.setText(EN_TEXT_TEST);
            }
            //不是测试文本的情况，需要调用API，翻译时同时调用百度翻译和文心一言的API
            else
            {
                //从文本框中获取待翻译的语句
                String query = cnText.getText();
                try {
                    //百度翻译API调用方法进行翻译
                    String result = BaiduTranslate.getTransResult(query,"zh","en");
                    //对结果进行JSON解析，获得真正的结果文本
                    String resultText = jsonToRes(result);
                    //打印在控制台上
                    System.out.println(resultText);
                    //调用文心一言的API，返回翻译文本
                    String wenXinRes = WenXin.askWenXin(CN_TO_EN_COMMAND + query);
                    //将两个返回结果共同设置到文本框当中
                    enText.setText("百度翻译："+resultText+"\n文心一言："+wenXinRes);
                } catch (UnsupportedEncodingException ex) {
                    throw new RuntimeException(ex);
                }
            }
        }
        else if(e.getSource() == enToCn)
        {
            //指令是英文翻译中文
            if(enText.getText().equals(EN_TEXT_TEST))
            {
                //将对应的英文测试文本设置到英文的文本框即可
                cnText.setText(CN_TEXT_TEST);
            }
            else
            {
                //用百度翻译
                String query = enText.getText();
                try {
                    //百度翻译API
                    String result = BaiduTranslate.getTransResult(query,"en","zh");
                    System.out.println(result);
                    String resultText = jsonToRes(result);
                    System.out.println(resultText);
                    String wenXinRes = WenXin.askWenXin(EN_TO_CN_COMMAND + query);
                    cnText.setText("百度翻译："+resultText+"\n文心一言："+wenXinRes);
                } catch (UnsupportedEncodingException ex) {
                    throw new RuntimeException(ex);
                }
            }
        }
    }

    //将百度翻译API返回的JSON格式数据解析出真正的翻译结果的方法
    public String jsonToRes(String transResult) {
        //将传入的字符串对象用JSON.to方法转换为自己定义的接收结果的对象
        TranslateResult result = JSON.to(TranslateResult.class, transResult);
        //result可能有多个，要遍历集合，所以创建一个StringBuilder对象
        StringBuilder sb = new StringBuilder();
        //逐个获取结果加入
        for (TranslateMap map : result.getTrans_result()) {
            sb.append(map.getDst());
        }
        //返回字符串
        return sb.toString();
    }

}
